/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sni.org.pe.seguridad;

import java.io.Serializable;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import org.primefaces.component.selectonemenu.SelectOneMenu;
import org.primefaces.context.RequestContext;
import org.primefaces.model.DualListModel;
import sni.org.pe.model.OpcionSistema;
import sni.org.pe.model.Perfil;
import sni.org.pe.session.remote.OpcionSistemaSessionEJBRemote;
import sni.org.pe.session.remote.PerfilSessionEJBRemote;
import sni.org.pe.utilitario.Estados;
import sni.org.pe.utilitario.ServiceLocator;
import sni.org.pe.utilitario.UParametro;
import sni.org.pe.utilitario.UProperties;

/**
 *
 * @author Ericson
 */
@ManagedBean(name = "mbperfil")
@ViewScoped
public class MBPerfil implements Serializable {

    private String nombrePerfil;
    private Integer estadoLista;
    private SelectOneMenu lstEstado;
    private List<Perfil> perfilList;
    private Perfil perfilSelected;
    private PerfilSessionEJBRemote ejbPerfil;
    private OpcionSistemaSessionEJBRemote ejbOSist;
    private ServiceLocator sLocator;
    private FacesContext fc;
    private DualListModel<OpcionSistema> opts;
    private boolean isEdit;

    public MBPerfil() {
        fc = FacesContext.getCurrentInstance();
        sLocator = new ServiceLocator();
        ejbPerfil = (PerfilSessionEJBRemote) sLocator.findServiceRemote(UProperties.getMessage(UParametro.RUTA_JNDI, "PERFIL"));
        ejbOSist = (OpcionSistemaSessionEJBRemote) sLocator.findServiceRemote(UProperties.getMessage(UParametro.RUTA_JNDI, "OPCION_SISTEMA"));
        if (perfilSelected == null) {
            perfilSelected = new Perfil();
        }
        isEdit = true;
        opts = new DualListModel<OpcionSistema>();
    }

    /**
     * @return the nombrePerfil
     */
    public String getNombrePerfil() {
        return nombrePerfil;
    }

    /**
     * @param nombrePerfil the nombrePerfil to set
     */
    public void setNombrePerfil(String nombrePerfil) {
        this.nombrePerfil = nombrePerfil;
    }

    /**
     * @return the estadoLista
     */
    public Integer getEstadoLista() {
        return estadoLista;
    }

    /**
     * @param estadoLista the estadoLista to set
     */
    public void setEstadoLista(Integer estadoLista) {
        this.estadoLista = estadoLista;
    }

    /**
     * @return the lstEstado
     */
    public SelectOneMenu getLstEstado() {
        return lstEstado;
    }

    /**
     * @param lstEstado the lstEstado to set
     */
    public void setLstEstado(SelectOneMenu lstEstado) {
        this.lstEstado = lstEstado;
    }

    public void buscar() {
        Integer valor = Integer.parseInt(lstEstado.getValue().toString());
        perfilList = ejbPerfil.findByName(nombrePerfil, valor);
        if(perfilList==null || perfilList.isEmpty()){
           String nombreVentana = UProperties.getMessage(UParametro.RUTA_MENSAJES, "WARNING_MESSAGE");
            String mensajeVentana = UProperties.getMessage(UParametro.RUTA_MENSAJES, "BUSQUEDA_PERFIL_EMPTY");
            FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_WARN, nombreVentana, mensajeVentana);
            FacesContext.getCurrentInstance().addMessage(null, msg); 
        }
    }

    /**
     * @return the perfilList
     */
    public List<Perfil> getPerfilList() {
        return perfilList;
    }

    /**
     * @param perfilList the perfilList to set
     */
    public void setPerfilList(List<Perfil> perfilList) {
        this.perfilList = perfilList;
    }

    /**
     * @return the perfilSelected
     */
    public Perfil getPerfilSelected() {
        return perfilSelected;
    }

    /**
     * @param perfilSelected the perfilSelected to set
     */
    public void setPerfilSelected(Perfil perfilSelected) {
        this.perfilSelected = perfilSelected;
    }

    public void nuevoPerfil() {
        List<OpcionSistema> source = ejbOSist.findMenu(Estados.OPCION_SISTEMA_SUB_MENU);
        perfilSelected = new Perfil();
        opts = new DualListModel<OpcionSistema>(source, new ArrayList<OpcionSistema>());
    }

    public void editarPerfil() {
        //Listando los valores del listado completo de las opciones
        List<OpcionSistema> source = new ArrayList<OpcionSistema>();
        source = ejbOSist.findSubMenus(perfilSelected);
        opts = new DualListModel<OpcionSistema>(source, perfilSelected.getOpcionSistemaList());
        if(perfilSelected.getIseditperfil().compareTo(Estados.PERFIL_EDITABLE)==0){
            isEdit=true;
        }else{
            isEdit=false;
        }
    }

    public void eliminarPerfil(ActionEvent event) {
        int deletePerfil = ejbPerfil.deletePerfil(perfilSelected);
        if (deletePerfil == Estados.FAIL_TRANSACTION) {
            String nombreVentana = UProperties.getMessage(UParametro.RUTA_MENSAJES, "ERROR_MESSAGE");
            String mensajeVentana = UProperties.getMessage(UParametro.RUTA_MENSAJES, "REGISTRO_PERFIL_FAIL");
            FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, nombreVentana, mensajeVentana);
            FacesContext.getCurrentInstance().addMessage(null, msg);
        } else if (deletePerfil == Estados.REGISTRO_OK) {
            perfilList.remove(perfilSelected);
            String nombreVentana = UProperties.getMessage(UParametro.RUTA_MENSAJES, "CONFIRMATION_MESSAGE");
            String mensajeVentana = UProperties.getMessage(UParametro.RUTA_MENSAJES, "ELIMINACION_PERFIL_OK");
            FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, nombreVentana, mensajeVentana);
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }

    }

    /**
     * @return the opts
     */
    public DualListModel<OpcionSistema> getOpts() {
        return opts;
    }

    /**
     * @param opts the opts to set
     */
    public void setOpts(DualListModel<OpcionSistema> opts) {
        this.opts = opts;
    }

    public void guardarPerfil(ActionEvent event) {
        if (!isEdit) {
            perfilSelected.setIseditperfil(BigInteger.ZERO);
        } else {
            perfilSelected.setIseditperfil(BigInteger.ONE);
        }

        perfilSelected.setOpcionSistemaList(opts.getTarget());

        if (perfilSelected.getIdperfil() != null) {
            if (ejbPerfil.updatePerfil(perfilSelected) == Estados.REGISTRO_OK) {
                String nombreVentana = UProperties.getMessage(UParametro.RUTA_MENSAJES, "CONFIRMATION_MESSAGE");
                String mensajeVentana = UProperties.getMessage(UParametro.RUTA_MENSAJES, "MODIFICACION_PERFIL_OK");
                FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, nombreVentana, mensajeVentana);
                FacesContext.getCurrentInstance().addMessage(null, msg);
                buscar();
            } else {
                String nombreVentana = UProperties.getMessage(UParametro.RUTA_MENSAJES, "ERROR_MESSAGE");
                String mensajeVentana = UProperties.getMessage(UParametro.RUTA_MENSAJES, "MODIFICACION_PERFIL_FAIL");
                FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, nombreVentana, mensajeVentana);
                FacesContext.getCurrentInstance().addMessage(null, msg);
            }
        } else {
            if (ejbPerfil.persistPerfil(perfilSelected) != null) {
                String nombreVentana = UProperties.getMessage(UParametro.RUTA_MENSAJES, "CONFIRMATION_MESSAGE");
                String mensajeVentana = UProperties.getMessage(UParametro.RUTA_MENSAJES, "REGISTRO_PERFIL_OK");
                FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, nombreVentana, mensajeVentana);
                FacesContext.getCurrentInstance().addMessage(null, msg);
                buscar();
            } else {
                String nombreVentana = UProperties.getMessage(UParametro.RUTA_MENSAJES, "ERROR_MESSAGE");
                String mensajeVentana = UProperties.getMessage(UParametro.RUTA_MENSAJES, "REGISTRO_PERFIL_FAIL");
                FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, nombreVentana, mensajeVentana);
                FacesContext.getCurrentInstance().addMessage(null, msg);
            }
        }

    }

    /**
     * @return the isEdit
     */
    public boolean isIsEdit() {
        return isEdit;
    }

    /**
     * @param isEdit the isEdit to set
     */
    public void setIsEdit(boolean isEdit) {
        this.isEdit = isEdit;
    }
}
